﻿2026-05-10T14:39:40.2122039Z ##[group]Run pnpm verify:phase-5
2026-05-10T14:39:40.2122374Z [36;1mpnpm verify:phase-5[0m
2026-05-10T14:39:40.2146614Z shell: /usr/bin/bash -e {0}
2026-05-10T14:39:40.2146900Z env:
2026-05-10T14:39:40.2147164Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T14:39:40.2147497Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T14:39:40.2147733Z   SKIP_TRACE_CHECK: 1
2026-05-10T14:39:40.2147970Z ##[endgroup]
2026-05-10T14:39:40.5038553Z 
2026-05-10T14:39:40.5039696Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-10T14:39:40.5040742Z > node scripts/verify-phase-5.mjs
2026-05-10T14:39:40.5041457Z 
2026-05-10T14:39:40.5525306Z 
2026-05-10T14:39:40.5545360Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-10T14:39:40.5546106Z >>> pnpm verify:phase-4
2026-05-10T14:39:40.8523566Z 
2026-05-10T14:39:40.8524958Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T14:39:40.8526290Z > node scripts/verify-phase-4.mjs
2026-05-10T14:39:40.8526830Z 
2026-05-10T14:39:40.8837221Z 
2026-05-10T14:39:40.8838290Z === Workspace: typecheck ===
2026-05-10T14:39:40.8839044Z >>> pnpm -r typecheck
2026-05-10T14:39:41.2093596Z Scope: 5 of 6 workspace projects
2026-05-10T14:39:41.2186062Z packages/db typecheck$ tsc --noEmit
2026-05-10T14:39:41.2196306Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T14:39:43.6890408Z packages/game-logic typecheck: Done
2026-05-10T14:39:43.6925753Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T14:39:46.0076486Z packages/db typecheck: Done
2026-05-10T14:39:47.2517307Z packages/protocol typecheck: Done
2026-05-10T14:39:47.2533589Z apps/server typecheck$ tsc --noEmit
2026-05-10T14:39:47.2534450Z apps/client typecheck$ tsc --noEmit
2026-05-10T14:39:58.4949953Z apps/client typecheck: Done
2026-05-10T14:39:59.4067688Z apps/server typecheck: Done
2026-05-10T14:39:59.4185378Z 
2026-05-10T14:39:59.4186298Z === Lint: protocol-sync ===
2026-05-10T14:39:59.4187102Z >>> pnpm lint:protocol-sync
2026-05-10T14:39:59.7149047Z 
2026-05-10T14:39:59.7149976Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T14:39:59.7150600Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T14:39:59.7150824Z 
2026-05-10T14:39:59.7468695Z lint-protocol-sync: OK
2026-05-10T14:39:59.7599859Z 
2026-05-10T14:39:59.7600721Z === Lint: game-logic-purity ===
2026-05-10T14:39:59.7601511Z >>> pnpm lint:game-logic-purity
2026-05-10T14:40:00.0547365Z 
2026-05-10T14:40:00.0548359Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T14:40:00.0549596Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T14:40:00.0550227Z 
2026-05-10T14:40:00.0889428Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T14:40:00.1023303Z 
2026-05-10T14:40:00.1024184Z === Lint: better-auth-schema-sync ===
2026-05-10T14:40:00.1025938Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T14:40:00.3979682Z 
2026-05-10T14:40:00.3980913Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:40:00.3982310Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T14:40:00.3983029Z 
2026-05-10T14:40:01.8889906Z lint-better-auth-schema-sync: OK
2026-05-10T14:40:01.9035622Z 
2026-05-10T14:40:01.9036565Z === Lint: rate-limit-budgets ===
2026-05-10T14:40:01.9037326Z >>> pnpm lint:rate-limit-budgets
2026-05-10T14:40:02.2017550Z 
2026-05-10T14:40:02.2018788Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T14:40:02.2020704Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T14:40:02.2021374Z 
2026-05-10T14:40:02.2341574Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T14:40:02.2485415Z 
2026-05-10T14:40:02.2486355Z === Lint: no-clipboard-rce ===
2026-05-10T14:40:02.2487266Z >>> pnpm lint:no-clipboard-rce
2026-05-10T14:40:02.5468650Z 
2026-05-10T14:40:02.5469385Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T14:40:02.5469917Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T14:40:02.5470157Z 
2026-05-10T14:40:02.5832848Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T14:40:02.5965810Z 
2026-05-10T14:40:02.5966720Z === Lint: room-layout ===
2026-05-10T14:40:02.5969823Z >>> pnpm lint:room-layout
2026-05-10T14:40:02.8952396Z 
2026-05-10T14:40:02.8953709Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T14:40:02.8955188Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T14:40:02.8956115Z 
2026-05-10T14:40:02.9347758Z lint-room-layout: OK
2026-05-10T14:40:02.9491712Z 
2026-05-10T14:40:02.9492605Z === ADR 0004 lint ===
2026-05-10T14:40:02.9493500Z >>> pnpm lint:adr:0004
2026-05-10T14:40:03.2507886Z 
2026-05-10T14:40:03.2509019Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T14:40:03.2510439Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T14:40:03.2511400Z 
2026-05-10T14:40:03.2838768Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:40:03.2975476Z 
2026-05-10T14:40:03.2976464Z === Drizzle: emit-check ===
2026-05-10T14:40:03.2977193Z >>> pnpm db:emit-check
2026-05-10T14:40:03.5953472Z 
2026-05-10T14:40:03.5954608Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T14:40:03.5957627Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T14:40:03.5959720Z 
2026-05-10T14:40:04.0456191Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T14:40:04.0458395Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T14:40:04.4264134Z 8 tables
2026-05-10T14:40:04.4265335Z accounts 8 columns 1 indexes 0 fks
2026-05-10T14:40:04.4266346Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T14:40:04.4267161Z characters 9 columns 0 indexes 1 fks
2026-05-10T14:40:04.4267933Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T14:40:04.4268832Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T14:40:04.4269674Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T14:40:04.4270468Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T14:40:04.4271252Z sessions 5 columns 0 indexes 1 fks
2026-05-10T14:40:04.4271735Z 
2026-05-10T14:40:04.4272602Z No schema changes, nothing to migrate 😴
2026-05-10T14:40:04.5413399Z 
2026-05-10T14:40:04.5414313Z === Drizzle: schema-sync ===
2026-05-10T14:40:04.5415590Z >>> pnpm lint:schema-sync
2026-05-10T14:40:04.8569170Z 
2026-05-10T14:40:04.8570395Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T14:40:04.8573929Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T14:40:04.8576641Z 
2026-05-10T14:40:04.8859621Z OK
2026-05-10T14:40:04.9005587Z 
2026-05-10T14:40:04.9016471Z === Drizzle: source-comments ===
2026-05-10T14:40:04.9021943Z >>> pnpm lint:source-comments
2026-05-10T14:40:05.1971370Z 
2026-05-10T14:40:05.1975732Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T14:40:05.1976819Z > pnpm -C packages/db run lint:source-comments
2026-05-10T14:40:05.1977809Z 
2026-05-10T14:40:05.5289337Z 
2026-05-10T14:40:05.5290618Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T14:40:05.5291793Z > node scripts/check-source-comments.mjs
2026-05-10T14:40:05.5292424Z 
2026-05-10T14:40:05.5657077Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T14:40:05.5897780Z 
2026-05-10T14:40:05.5898716Z === Workspace: test ===
2026-05-10T14:40:05.5899429Z >>> pnpm -r test
2026-05-10T14:40:05.8908274Z Scope: 5 of 6 workspace projects
2026-05-10T14:40:05.8960977Z packages/db test$ vitest run
2026-05-10T14:40:05.8970196Z packages/game-logic test$ vitest run
2026-05-10T14:40:06.3897490Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T14:40:06.4012237Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T14:40:06.7434520Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-10T14:40:06.9837131Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:40:07.2022524Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:07.3928320Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T14:40:07.4411396Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:07.4486698Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:40:07.4527125Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T14:40:07.4604413Z packages/game-logic test: [2m   Start at [22m 14:40:06
2026-05-10T14:40:07.4606851Z packages/game-logic test: [2m   Duration [22m 1.04s[2m (transform 113ms, setup 0ms, import 190ms, tests 51ms, environment 1ms)[22m
2026-05-10T14:40:07.5126771Z packages/game-logic test: Done
2026-05-10T14:40:07.5135704Z packages/protocol test$ vitest run
2026-05-10T14:40:08.0251827Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T14:40:08.2094880Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:40:08.4578401Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-10T14:40:08.4877917Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:08.4895960Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T14:40:08.4954043Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T14:40:08.4957552Z packages/db test: [2m   Start at [22m 14:40:06
2026-05-10T14:40:08.4958855Z packages/db test: [2m   Duration [22m 2.08s[2m (transform 153ms, setup 0ms, import 1.43s, tests 27ms, environment 0ms)[22m
2026-05-10T14:40:08.5035095Z packages/db test: Done
2026-05-10T14:40:08.6238760Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:40:08.7927678Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:40:08.9437169Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:40:08.9515595Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:40:08.9722933Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T14:40:08.9724211Z packages/protocol test: [2m   Start at [22m 14:40:08
2026-05-10T14:40:08.9734119Z packages/protocol test: [2m   Duration [22m 938ms[2m (transform 152ms, setup 0ms, import 279ms, tests 37ms, environment 0ms)[22m
2026-05-10T14:40:08.9897115Z packages/protocol test: Done
2026-05-10T14:40:08.9901842Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T14:40:08.9905919Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T14:40:09.5340986Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T14:40:09.5543868Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T14:40:10.5646813Z apps/server test: {"level":30,"time":1778424010559,"pid":4405,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T14:40:10.5673927Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 752[2mms[22m[39m
2026-05-10T14:40:10.5703706Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 595[2mms[22m[39m
2026-05-10T14:40:11.1057909Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T14:40:11.1060570Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T14:40:11.1183545Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 186[2mms[22m[39m
2026-05-10T14:40:11.6220576Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T14:40:11.6236583Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-YBcfdw/rebno.db
2026-05-10T14:40:11.6256116Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:11.6275785Z apps/server test: [run-migrations] OK
2026-05-10T14:40:11.6379722Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T14:40:11.6388012Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-IHv3HX/rebno.db
2026-05-10T14:40:11.6393297Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:11.6409027Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T14:40:11.6412015Z apps/server test: [run-migrations] OK
2026-05-10T14:40:11.6470530Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:40:11.6476016Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-PoBOKD/rebno.db
2026-05-10T14:40:11.6501854Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:11.6505433Z apps/server test: [run-migrations] OK
2026-05-10T14:40:11.6525820Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:40:11.6545965Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-PoBOKD/rebno.db
2026-05-10T14:40:11.6553785Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:11.6555749Z apps/server test: [run-migrations] OK
2026-05-10T14:40:11.6563391Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 67[2mms[22m[39m
2026-05-10T14:40:12.3157599Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 149[2mms[22m[39m
2026-05-10T14:40:12.7211624Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 51[2mms[22m[39m
2026-05-10T14:40:12.9847083Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:40:13.2456982Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T14:40:13.5125726Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 100[2mms[22m[39m
2026-05-10T14:40:13.5362703Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:40:13.7798299Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:40:14.1246869Z apps/server test: {"level":40,"time":1778424014121,"pid":4545,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:40:14.1326452Z apps/server test: {"level":40,"time":1778424014125,"pid":4545,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:40:14.1366365Z apps/server test: {"level":40,"time":1778424014126,"pid":4545,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:40:14.1368516Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T14:40:14.3994489Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T14:40:14.6247015Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:14.6936139Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 115[2mms[22m[39m
2026-05-10T14:40:15.5010770Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T14:40:15.5050324Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ encrypted .env [www.dotenvx.com]
2026-05-10T14:40:15.5063318Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T14:40:15.8145707Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 35[2mms[22m[39m
2026-05-10T14:40:16.2302018Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:16.2366298Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T14:40:16.2386075Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T14:40:16.2435832Z apps/server test: [2m   Start at [22m 14:40:09
2026-05-10T14:40:16.2466171Z apps/server test: [2m   Duration [22m 6.69s[2m (transform 476ms, setup 0ms, import 3.37s, tests 969ms, environment 2ms)[22m
2026-05-10T14:40:16.2873938Z apps/server test: Done
2026-05-10T14:40:16.7910204Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:40:17.4907354Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:40:18.1788335Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:40:18.8585040Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:40:19.5403077Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:20.2139658Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:40:20.9207202Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:40:21.5893464Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:40:22.2731457Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:40:22.9402789Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:40:23.6175792Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:40:23.6371872Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T14:40:23.6396928Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T14:40:23.6399830Z apps/client test: [2m   Start at [22m 14:40:09
2026-05-10T14:40:23.6401586Z apps/client test: [2m   Duration [22m 14.08s[2m (transform 489ms, setup 45ms, collect 783ms, tests 664ms, environment 8.20s, prepare 1.58s)[22m
2026-05-10T14:40:23.7786180Z apps/client test: Done
2026-05-10T14:40:23.7882816Z 
2026-05-10T14:40:23.7883654Z verify-phase-4: OK (12 steps green)
2026-05-10T14:40:23.8015472Z 
2026-05-10T14:40:23.8021868Z === Workspace: typecheck ===
2026-05-10T14:40:23.8022575Z >>> pnpm -r typecheck
2026-05-10T14:40:24.1048868Z Scope: 5 of 6 workspace projects
2026-05-10T14:40:24.1101571Z packages/db typecheck$ tsc --noEmit
2026-05-10T14:40:24.1110651Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T14:40:26.6286945Z packages/game-logic typecheck: Done
2026-05-10T14:40:26.6316436Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T14:40:28.9783651Z packages/db typecheck: Done
2026-05-10T14:40:30.3474128Z packages/protocol typecheck: Done
2026-05-10T14:40:30.3481320Z apps/client typecheck$ tsc --noEmit
2026-05-10T14:40:30.3484004Z apps/server typecheck$ tsc --noEmit
2026-05-10T14:40:41.3410797Z apps/client typecheck: Done
2026-05-10T14:40:42.3672539Z apps/server typecheck: Done
2026-05-10T14:40:42.3787813Z 
2026-05-10T14:40:42.3788600Z === Lint: deploy-stack ===
2026-05-10T14:40:42.3789221Z >>> pnpm lint:deploy-stack
2026-05-10T14:40:42.6798489Z 
2026-05-10T14:40:42.6803132Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-10T14:40:42.6806116Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-10T14:40:42.6806487Z 
2026-05-10T14:40:42.7135762Z lint-deploy-stack: OK
2026-05-10T14:40:42.7286231Z 
2026-05-10T14:40:42.7287269Z === Lint: deploy-stack test ===
2026-05-10T14:40:42.7288533Z >>> pnpm lint:deploy-stack:test
2026-05-10T14:40:43.0248154Z 
2026-05-10T14:40:43.0249644Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-10T14:40:43.0251128Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-10T14:40:43.0251908Z 
2026-05-10T14:40:43.0901945Z PASS: lint-deploy-stack green
2026-05-10T14:40:43.1042204Z 
2026-05-10T14:40:43.1043046Z === ADR 0005 lint ===
2026-05-10T14:40:43.1044161Z >>> pnpm lint:adr:0005
2026-05-10T14:40:43.4015611Z 
2026-05-10T14:40:43.4022833Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-10T14:40:43.4027989Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-10T14:40:43.4028952Z 
2026-05-10T14:40:43.4351979Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:40:43.4490992Z 
2026-05-10T14:40:43.4491906Z === ADR 0006 lint ===
2026-05-10T14:40:43.4492953Z >>> pnpm lint:adr:0006
2026-05-10T14:40:43.7518152Z 
2026-05-10T14:40:43.7519431Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-10T14:40:43.7522575Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-10T14:40:43.7523245Z 
2026-05-10T14:40:43.7848207Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T14:40:43.7990858Z 
2026-05-10T14:40:43.7991811Z === Workspace: test ===
2026-05-10T14:40:43.7993095Z >>> pnpm -r test
2026-05-10T14:40:44.1079697Z Scope: 5 of 6 workspace projects
2026-05-10T14:40:44.1133723Z packages/db test$ vitest run
2026-05-10T14:40:44.1142147Z packages/game-logic test$ vitest run
2026-05-10T14:40:44.6106228Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T14:40:44.6108491Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T14:40:44.9511820Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-10T14:40:45.2162299Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T14:40:45.4451744Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:45.5526985Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T14:40:45.6779269Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:45.6877342Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:40:45.6916857Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T14:40:45.6918330Z packages/game-logic test: [2m   Start at [22m 14:40:44
2026-05-10T14:40:45.6946629Z packages/game-logic test: [2m   Duration [22m 1.07s[2m (transform 116ms, setup 0ms, import 187ms, tests 60ms, environment 1ms)[22m
2026-05-10T14:40:45.7336623Z packages/game-logic test: Done
2026-05-10T14:40:45.7385847Z packages/protocol test$ vitest run
2026-05-10T14:40:46.2427172Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T14:40:46.3994154Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:40:46.6847488Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:46.6892136Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T14:40:46.6918106Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T14:40:46.6938571Z packages/db test: [2m   Start at [22m 14:40:44
2026-05-10T14:40:46.7066905Z packages/db test: [2m   Duration [22m 2.07s[2m (transform 142ms, setup 0ms, import 1.41s, tests 28ms, environment 0ms)[22m
2026-05-10T14:40:46.7107745Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T14:40:46.7426234Z packages/db test: Done
2026-05-10T14:40:46.9092953Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:47.0887749Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:40:47.2492712Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:40:47.2536144Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T14:40:47.2555308Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T14:40:47.2560718Z packages/protocol test: [2m   Start at [22m 14:40:46
2026-05-10T14:40:47.2562456Z packages/protocol test: [2m   Duration [22m 1.00s[2m (transform 125ms, setup 0ms, import 267ms, tests 37ms, environment 0ms)[22m
2026-05-10T14:40:47.2887218Z packages/protocol test: Done
2026-05-10T14:40:47.2895882Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T14:40:47.2897605Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T14:40:47.8213194Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T14:40:47.9156456Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T14:40:48.9029634Z apps/server test: {"level":30,"time":1778424048899,"pid":5275,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T14:40:48.9116451Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 761[2mms[22m[39m
2026-05-10T14:40:48.9118122Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 602[2mms[22m[39m
2026-05-10T14:40:49.4703171Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T14:40:49.4726407Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T14:40:49.4836608Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 120[2mms[22m[39m
2026-05-10T14:40:50.0227776Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T14:40:50.0246127Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-muCom7/rebno.db
2026-05-10T14:40:50.0262773Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:50.0265545Z apps/server test: [run-migrations] OK
2026-05-10T14:40:50.0407469Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T14:40:50.0444594Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-iojJLL/rebno.db
2026-05-10T14:40:50.0446159Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:50.0499526Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T14:40:50.0532404Z apps/server test: [run-migrations] OK
2026-05-10T14:40:50.0596842Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:40:50.0602792Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RiY14z/rebno.db
2026-05-10T14:40:50.0626078Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:50.0633981Z apps/server test: [run-migrations] OK
2026-05-10T14:40:50.0636146Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T14:40:50.0637991Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RiY14z/rebno.db
2026-05-10T14:40:50.0639959Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T14:40:50.0641057Z apps/server test: [run-migrations] OK
2026-05-10T14:40:50.0642424Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 48[2mms[22m[39m
2026-05-10T14:40:50.6699903Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 121[2mms[22m[39m
2026-05-10T14:40:51.1453877Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 56[2mms[22m[39m
2026-05-10T14:40:51.3926788Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T14:40:51.7040111Z apps/server test: {"level":40,"time":1778424051698,"pid":5391,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:40:51.7106054Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T14:40:51.7119853Z apps/server test: {"level":40,"time":1778424051703,"pid":5391,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:40:51.7126081Z apps/server test: {"level":40,"time":1778424051704,"pid":5391,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T14:40:51.8554355Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 103[2mms[22m[39m
2026-05-10T14:40:51.9732126Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T14:40:52.2957077Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T14:40:52.5432516Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:40:52.7966939Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:40:53.0447233Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 108[2mms[22m[39m
2026-05-10T14:40:53.6345594Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T14:40:53.6347726Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ enable debugging { debug: true }
2026-05-10T14:40:53.6349268Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T14:40:54.2687239Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-10T14:40:54.3993715Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T14:40:54.6517298Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T14:40:54.6579544Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T14:40:54.6600455Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T14:40:54.6616066Z apps/server test: [2m   Start at [22m 14:40:47
2026-05-10T14:40:54.6631759Z apps/server test: [2m   Duration [22m 6.81s[2m (transform 517ms, setup 0ms, import 3.44s, tests 976ms, environment 2ms)[22m
2026-05-10T14:40:54.7126400Z apps/server test: Done
2026-05-10T14:40:55.1487475Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T14:40:55.9578418Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T14:40:56.6717262Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:40:57.3517871Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T14:40:58.0287175Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T14:40:58.7240297Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:40:59.4475451Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T14:41:00.1576653Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:41:00.8636300Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T14:41:01.5426675Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:41:02.2556697Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T14:41:02.2764227Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T14:41:02.2784339Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T14:41:02.2785854Z apps/client test: [2m   Start at [22m 14:40:47
2026-05-10T14:41:02.2792398Z apps/client test: [2m   Duration [22m 14.36s[2m (transform 514ms, setup 61ms, collect 795ms, tests 565ms, environment 8.28s, prepare 1.64s)[22m
2026-05-10T14:41:02.4159895Z apps/client test: Done
2026-05-10T14:41:02.4259833Z 
2026-05-10T14:41:02.4260548Z verify-phase-5: OK (7 steps green)
